package nancal.mp.model


import nbcp.base.comm.JsonMap
import nbcp.base.enums.JsonSceneScopeEnum
import nbcp.base.extend.AsString
import nbcp.base.extend.ConvertJson
import nbcp.base.extend.getValueByWbsPath
import nbcp.base.utils.StringUtil
import org.slf4j.LoggerFactory


/**
 * @param map 对key 使用小驼峰和连字符格式 分别替换。
 */
private fun replaceVarModel(map: JsonMap, content: String): String {
    val logger = LoggerFactory.getLogger(K8sDeployServiceModel::class.java)
    return Regex("""@([\w\.\-\_]+?)@""").replace(content, {
        var keys = it.groupValues.get(1).split(".");
        var key = keys.map { StringUtil.getSmallCamelCase(it) }.joinToString(".");
        var v = map.getValueByWbsPath(key);


        // 忽略掉一个特殊字符的情况，在不区分名称空间时使用。
        if (v == "-") {
            return@replace "";
        }

        if (v != null) {
            return@replace v.AsString();
        }

        var key2 = keys.map { StringUtil.getKebabCase(it) }.joinToString(".");


        if (key != key2) {
            var v2 = map.getValueByWbsPath(key2);

            // 忽略掉一个特殊字符的情况，在不区分名称空间时使用。
            if (v2 == "-") {
                return@replace "";
            }

            if (v2 != null) {
                return@replace v2.AsString();
            }
        }

        logger.warn("变量${it.groupValues.get(1)} 没有找到,使用空串")
        return@replace ""
        //throw RuntimeException("replaceVarModel 方法找不到变量： ${it.groupValues.get(1)}")
    })
}


/**
 * 处理3个方法 $k, $b ,$s
 */
private fun String.replaceCase(): String {

    return Regex("""\${'$'}([kbs])\((.+?)\)""").replace(this, {
        var method = it.groupValues.get(1);
        var txt = it.groupValues.get(2);

        if (method == "k") {
            return@replace StringUtil.getKebabCase(txt)
        }
        if (method == "b") {
            return@replace StringUtil.getBigCamelCase(txt)
        }
        if (method == "s") {
            return@replace StringUtil.getSmallCamelCase(txt)
        }

        return@replace it.groupValues.get(0);
    })
}

fun String.replaceVarModel(def: Any): String {

    var map = def.ConvertJson(JsonMap::class, JsonSceneScopeEnum.WEB)

    var ret = replaceVarModel(map, this);

    if (ret.contains("@")) {
        ret = replaceVarModel(map, ret);
    }


    ret = ret.replaceCase();

    return ret;
}